7.2 panic

panic就是Go语言中的崩溃,崩溃也就是程序不可用,这在实际的业务中基本是最严重的BUG

在大部分语言中,产生崩溃的原因基本是差不多的,大多都是访问了空指针、数组越界、内存溢出等。

基本可以总结为,发生崩溃都是与系统进行了非法的内存或资源操作。

本节代码存放目录为 lesson20

如何发生panic

我们在开发中应该极力避免发生panic,想要知道怎么避免,我们首先需要知道panic是怎么发生。

数组越界是经常遇到的崩溃原因,也就是说数组本身只有3个元素,但是却去访问了第4个元素,这时候访问不到就会出现崩溃。

但是事实上,在Go语言中,是不可能出现数组越界的,当我们在代码中尝试访问越界的元素时,代码将会报错。

这是由于数组是长度固定的,所以编译器是会为我们进行代码检查的。

那么我们就可以想到,切片是长度可变的,那是不是就是会出现呢?答案是肯定的,代码如下所示:

var testSlice = []int{1, 2, 3}
fmt.Println(testSlice[4])

如何定位排查

执行上一段的代码,结果输出如下:

panic: runtime error: index out of range [4] with length 3

goroutine 1 [running]:
main.main()
        /Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d
exit status 2

我们可以直接看到崩溃信息,通过崩溃信息我们可以快速的知道是什么原因产生的崩溃,如下所示:

panic: runtime error: index out of range [4] with length 3

同时在Go语言中我们也可以快速定位到具体发生panic发生的代码行数,如下所示:

/Users/xc/xcWork/YouCanGo/Code/YouCanGoCode/lesson20/lesson20.go:7 +0x1d

从上面的输出,我们可以快速知道发生崩溃的地方,也就是代码的第7行。

手动panic

Go语言中,如果我们想要让程序主动崩溃,我们可以直接使用panic关键字,如下代码所示:

a := "123t"
num, err := strconv.ParseInt(a, 10, 64)
if err != nil {
    panic(err)
}
fmt.Println(num)

在上面的代码中,在发生错误时,我们直接使用panic(err)进行操作,这样就会导致程序直接崩溃。

这种方法在实际业务也有一些应用场景。

比如说当发生一些安全错误时,我们就将程序主动崩溃。

比如发生错误会导致继续运行而产生更严重的逻辑错误,我们可以进行主动崩溃。

小结

本节我们对panic的发生、排查进行了讲解,总结如下:

  • panic就是Go语言里的崩溃

  • 切片访问越界、空指针等会导致崩溃

  • 通过崩溃堆栈输出可以快速定位崩溃原因及崩溃代码

  • 可以通过panic(err)将程序主动崩溃

results matching ""

    No results matching ""